import java.util.Stack;

/**
 * 本题的难点：在于删除元素之后，如何得到剩下所有元素的最小值。
 * 维持两个栈：dataSt存储数据，minSt存储最小值；
 * 当删除元素后，minSt顶部的值也会被删除，以此保持minSt的栈顶始终是当前栈的最小值。
 */
public class MinStack {
    /**
     * initialize your data structure here.
     */
    private Stack<Integer> dataSt;
    private Stack<Integer> minSt;


    public MinStack() {
        dataSt = new Stack<Integer>();
        minSt = new Stack<Integer>();
    }

    public void push(int x) {
        dataSt.push(x);
        if (minSt.empty()) {
            minSt.push(x);
        } else {
            if (x < minSt.peek())
                minSt.push(x);
            else
                minSt.push(minSt.peek());
        }
    }

    public void pop() {
        dataSt.pop();
        minSt.pop();
    }

    public int top() {
        return dataSt.peek();
    }

    public int min() {
        return minSt.peek();
    }

    public static void main(String[] args) {
        MinStack stack = new MinStack();
        stack.push(1);
        System.out.println(stack.min());
    }
}
